cc-pocket · mobile ui 2.0 · chat · master v2 · source of truth

Chat Master v2

Consolidates the Chat frame from A Master Core v1, the 200% proof from A Master Proofs v1, and the confirmed Quick Actions sheet into one current file, with the later context-disclosure fixes folded in. Direction A is unchanged: this corrects and unifies, it does not re-style. Every frame below is a live instance of one shared device component, so state, locale, theme and type size are runtime, not redrawn.

402 × 874
iPhone 17 · 1:1
5 zones
1 lead state
0 new facts
0 route changes
The four questions

Which session is this, does it need me, what happened, what can I send. The zone order answers them in that order and nothing else competes for the top of the screen.

Context disclosure, corrected

Collapsed is two wrapping lines of real facts on one 48 pt target. Expanded groups identity and location, keeps the full path copyable and wrapping, and pins Session info below the scrolling body so it can never hide.

One lead state

Approval, Answer, Failure, Running — in that order, one at a time. Streaming under a higher state is a subordinate qualifier, never a second headline. Idle has no block at all.

Held from v1

List-first transcript with quiet source labels, hairline tool bands, two-layer composer, and the confirmed Quick Actions sheet reached from the only top-right action. No bubbles, cards, gradients or new navigation.

A

Walk the master

The control column is prototype chrome for review. It is not product navigation and ships nowhere.
Acceptance path
{{ p.n }}{{ p.text }}
 
{{ p.n }}{{ p.text }}
Fixtures, not telemetry

Title Review relay reconnect handling, agent Claude, mode Ask every time, model fable, computer MacBook-Pro, folder cc-pocket. Session stack and context occupancy render only because these fixtures supply values; omit the props and the chips disappear rather than showing zero. No timestamp, duration, branch or health value exists anywhere in this file.

B

Required proofs

Ten live instances at exactly 402 × 874. Drive any one without disturbing the others.
01 · 中文 · dark · canonical

Context collapsed to two lines of real facts, no state block because nothing is pending, composer idle with the microphone. This is the reading state the design is tuned for.

02 · 中文 · dark · context expanded

Identity and location grouped, origin omitted because none is supplied, full path wrapping with its own copy target, Session info pinned under the body. At 100% type nothing here needs an inner scroll.

03 · EN · dark · running + queued

Running leads, the last agent turn is still streaming, and a typed draft puts Stop and Send side by side. The queue explanation is written above the row, not implied by the button.

04 · EN · dark · approval while running

Approval leads with the literal ask title; Running drops to a subordinate qualifier. No Review button here — the approval sheet owns that decision.

05 · 中文 · dark · answer required

The QuestionCard docks above the bottom area and owns its inputs, so the composer steps aside and says why in one line rather than disappearing silently.

06 · EN · light · failure, send gated

The pinned label is the localized Failure label and nothing else — ChatStateUi supplies no detail string for this state, so none is shown. The typed draft and Send stay visible: a gated send returns false and preserves the draft rather than clearing the field.

07 · 中文 · dark · quick actions open

The entry-point proof: the confirmed v1 hierarchy of four groups with Handoff as an ordinary peer row and no NEW badge. Interaction stays owned by Chat Quick Actions Master v1.

08 · EN · dark · long content

Three-line title clear of the overflow, deep path wrapping without ellipsis, a long ripgrep command wrapping inside its hairline band, and the origin row present because this fixture supplies one.

09 · 中文 · light · 200% type

At 402 × 874 rows grow to 58 pt and the facts body scrolls, while Session info, the transcript and the whole composer stay reachable. Nothing shrank to make this fit.

10 · EN · dark · parity check

English against frame 01's Chinese: identical geometry, identical group structure, only the fixed grammar changes. Model, machine and path stay literal in both.

C

Composer state strip

Component proofs of the accessory row's right slot. Same component the phone above mounts.
idle · empty

Placeholder names the real active agent. Right slot is the microphone.

text staged

Any typed content or ready attachment promotes the right slot to Send.

streaming · empty

Streaming with an empty field renders Stop alone; no other action occupies the slot.

streaming · queued

Stop and Send coexist. Send queues behind the running turn, and says so.

upload in progress

Send is muted with progress; sending waits for the upload to finish.

voice recording · 中文

Recording replaces the field per existing behaviour and adds no new route.

D

Zone contract

What is pinned, what flexes, and what each zone is forbidden to do.
ZoneNameHeightContractNever
{{ z.n }} {{ z.name }} {{ z.height }} {{ z.contract }} {{ z.never }}
State derivation

Approval and Answer come from a real pending request and may print its literal title over three lines. Failure renders the localized Failure label alone; ChatStateUi supplies no detail string, so no cause, banner or recovery wording appears. Running comes only from the streaming fact. Idle renders no block, and there is no Complete state — a finished session simply reads as its transcript. The block never repeats a Review or Answer button that the approval sheet or QuestionCard already owns.

Accessibility

Back, overflow, disclosure, machine switch, path copy, Session info and every composer control are named targets of at least 48 pt, including the 30 pt model and context chips. Disclosure exposes expanded and collapsed. Copy success is written, not just tinted. The state block is a status region whose label carries the state name, so shape and color stay supplementary. At 200% type rows grow and wrap; nothing shrinks and there is no horizontal scroll.

Unresolved trade-off

At 200% type with context expanded, the facts and path body scrolls internally, as specified — Session info and the composer stay pinned and reachable, but the transcript behind the expanded panel is reduced to a few lines. The panel is bounded rather than full-height, so it remains a disclosure and never becomes a page. If review prefers more transcript at that size, the next lever is a shorter bound on the facts body, not smaller type.

Supersedes. This file is the current Chat source of truth. A Master Core v1 frame 02 and A Master Proofs v1 frame 05 remain as history and are not edited. Quick Actions remains owned by Chat Quick Actions Master v1; the sheet shown in frame 07 is the entry-point proof from Chat, not a second definition of it — its interactive pickers, capability gates and two-tap Clear live in that file. Secure Approval remains owned by Approval Protocol Handoff v1 and is referenced here, never redrawn.